package com.paperless.util;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * @author : Administrator
 * @date : 2024/3/27 15:22
 * @description :
 */
public class CheckUtil {
    /**
     * 文件名最大容许的字符长度，包括后缀
     */
    private static final int UTF8_MAX_FILE_NAME_LENGTH = 255;
    /**
     * 文件全路径最大长度
     */
    private static final int UTF8_MAX_FILE_PATH_LENGTH = 1024;

    /**
     * 检查并修改文件使文件可创建
     * e.g /storage/emulated/0/Android/data/xlk.paperless.standard/files/Paperless/file/123.txt
     *
     * @param filePath 文件路径全名称
     * @return 修复后的路径（无需修复返回原路径）
     */
    public static String checkFilePath(String filePath) {
        if (filePath == null || filePath.isEmpty()) {
            throw new RuntimeException("filePath is Null or Empty");
        }
        File file = new File(filePath);
        String parent = file.getParent();
        String fileName = file.getName();
        String suitableFileName = getSuitableFileName(fileName);
        return parent + File.separator + suitableFileName;
    }

    /**
     * 计算截取成合适的带后缀的文件名,保证带后缀的文件名字符长度不超过255，不然在Android系统中无法创建
     *
     * @param fileName eg:123456789.txt
     * @return eg:123456.txt
     */
    public static String getSuitableFileName(String fileName) {
        int fileNameUTF8Length = getUTF8StringLength(fileName);
        if (fileNameUTF8Length > UTF8_MAX_FILE_NAME_LENGTH) {
            String name = fileName;//文件名：可能本身就没有后缀
            String suffix = "";//后缀：默认无后缀
            int endIndex = fileName.lastIndexOf(".");//后缀.的索引
            if (endIndex > 0) {//有后缀
                name = fileName.substring(0, endIndex);//无后缀的文件名 eg:123456789
                suffix = fileName.substring(endIndex);//后缀： eg: .txt
            }
            int nameLength = getUTF8StringLength(name);//文件无后缀的长度
            int suffixLength = fileNameUTF8Length - nameLength;//后缀的长度
            //计算得到去除后缀最大的文件名长度
            int maxLength = UTF8_MAX_FILE_NAME_LENGTH - suffixLength;//无后缀文件名最大长度
            if (nameLength > maxLength) {
                return cut(name, maxLength) + suffix;
            }
        }
        return fileName;
    }


    /**
     * 根据utf-8格式的字符长度截取文本
     *
     * @param content   文本内容
     * @param maxLength 最大字符长度
     * @return 截取后的内容
     */
    private static String cut(String content, int maxLength) {
        content = content.substring(0, content.length() - 1);//去除最后一个字符
        if (getUTF8StringLength(content) > maxLength) {
            return cut(content, maxLength);
        }
        return content;
    }

    public static int getUTF8StringLength(String content) {
        return content.getBytes(StandardCharsets.UTF_8).length;
    }
}
